package com.yaoxun.bored.service.sys.menu;

import java.util.List;

import javax.inject.Inject;

import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.yaoxun.bored.common.BaseService;
import com.yaoxun.bored.mapper.sys.menu.MenuMapper;
import com.yaoxun.bored.mapper.sys.menu.MenuTreeMapper;
import com.yaoxun.bored.model.sys.menu.Menu;
import com.yaoxun.bored.model.sys.menu.MenuTree;
import com.yaoxun.bored.util.enums.MenuLeaf;

import tk.mybatis.mapper.entity.Example;

@Service
public class MenuService extends BaseService<Menu> {

	@Inject
	private MenuMapper menuMapper;
	
	@Inject
	private MenuTreeMapper menuTreeMapper;
	
	@Transactional(readOnly=true)
	public List<MenuTree> selectByPid(Integer parentId) {
		Example example = new Example(MenuTree.class);
		example.createCriteria().andEqualTo("pid", parentId);
		List<MenuTree> trees = menuTreeMapper.selectByExample(example);// menuMapper.selectByPid(parentId);
		return trees;
	}
	
	@Transactional(readOnly=true)
	public List<Menu> selectMenuUseIndex(Integer[] roleIds, Integer parentId) {
		return menuMapper.selectMenuUseIndex(roleIds, parentId);
	}
	
	
	/**
	 * 判断菜单是否还有子节点
	 * @author Loren
	 * @createTime 2018年2月6日 上午11:59:08
	 * @param menuId
	 * @return true 存在，false 不存在
	 */
	public boolean existChildren(Integer menuId) {
		int count = menuMapper.selectExistChildren(menuId);
		if(count > 0) {
			return true;
		}
		return false;
	}
	
	/**
	 * 保存菜单
	 * @author Loren
	 * @createTime 2018年2月5日 下午6:26:13
	 * @param menu
	 * @return
	 */
	public void insertMenu(Menu menu) {
		menuMapper.insert(menu); //先插入
		String path = handlePath(menu);
		if(menu.getParentId().intValue() != 0) {
			menuMapper.updateLeaf(menu.getParentId(), MenuLeaf.NO_LEAF.value()); //设置父节点不是叶子节点
		}
		menuMapper.updatePath(menu.getMenuId(), path); //在更新path项
	}
	
	private String handlePath(Menu menu) {
		String path = null;
		if(true == StringUtils.isNotBlank(menu.getPath())) {
			if(menu.getLevel().intValue() > 2) {				
				path = menu.getPath() + "/" + menu.getMenuId();
			}else {
				path = menu.getPath() + menu.getMenuId();
			}
		}else {
			path = menu.getMenuId() + "/";
		}
		return path;
	}
	
	/**
	 * 查询菜单的上级ID
	 * @author Loren
	 * @createTime 2018年2月8日 上午9:20:01
	 * @param menuId
	 * @return
	 */
	public Integer selectPid(Integer menuId) {
		return menuMapper.selectPid(menuId);
	}
	
	/**
	 * 通过上级菜单统计其子节点数
	 * @author Loren
	 * @createTime 2018年2月8日 上午9:23:46
	 * @param parentId
	 * @return
	 */
	public int countLeafByPid(Integer parentId) {
		return menuMapper.countLeafByPid(parentId);
	}
	
	/**
	 * 查询菜单的上级菜单所拥有的子节点数
	 * @author Loren
	 * @createTime 2018年2月8日 上午9:03:33
	 * @param menuId
	 * @return
	 */
	public int selectCountPidLeaf(Integer menuId) {
		return menuMapper.selectCountPidLeaf(menuId);
	}
	
	/**
	 * 通过主键更新菜单
	 * @author Loren
	 * @createTime 2018年2月6日 上午11:30:59
	 * @param menu
	 * @return
	 */
	public void updateById(Menu menu) {
		if(menu.getParentId().intValue() != 0) {
			Integer pid = menuMapper.selectPid(menu.getParentId());
			if(menu.getParentId().intValue() != pid.intValue()) {
				int count = countLeafByPid(pid);
				if(count < 2) { //只有上级菜单 不包括自身数量大于1才不需要变成叶子节点
					menuMapper.updateLeaf(pid, MenuLeaf.IS_LEAF.value()); //设置为叶子节点
				}
			}
		}
		menuMapper.updateByPrimaryKeySelective(menu); //更新菜单项
		String path = handlePath(menu);
		if(menu.getParentId().intValue() != 0) {
			menuMapper.updateLeaf(menu.getParentId(), MenuLeaf.NO_LEAF.value()); //设置父节点不是叶子节点
		}
		menuMapper.updatePath(menu.getMenuId(), path); //在更新path项
	}
	
	public void deleteMenu(Menu menu) {
		if(menu.getParentId().intValue() != 0) {
			int count = countLeafByPid(menu.getParentId());
			if(count < 2) {
				menuMapper.updateLeaf(menu.getParentId(), MenuLeaf.IS_LEAF.value());
			}
		}
		if(menu.getLeaf().intValue() == MenuLeaf.IS_LEAF.value()) {
			menuMapper.deleteByPrimaryKey(menu.getMenuId());
		}else {			
			if(menu.getParentId().intValue() != 0) {
				menuMapper.deleteByPrimaryKey(menu.getMenuId());
			}
			Example example = new Example(Menu.class);
			example.createCriteria().andLike("path", menu.getMenuId().toString() + "/%");
			menuMapper.deleteByExample(example);
		}
	}
	
	
}
